﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using ClassLibraryEntidades;
using ClassLibraryEntidades.ExceptionsServer;

namespace SmartDeviceClient.Interfaz
{
    public partial class FormMostrarRuta : Form
    {
        //###############################################################################
        //##########                    ATRIBUTOS Y PROPIEDADES                ##########
        //###############################################################################

        #region atributos y propiedades


            public bool hayExcepcion;

            private Bitmap imagen;
            /// <summary>
            /// Mapa que se muestra.
            /// </summary>
            public Bitmap Imagen
            {
                set
                {
                    imagen = value;
                    visorImagen.Imagen = value;
                }
            }

            private StringBuilder informacion_texto;

            private Timer timerMovimientoUsuario;

        #endregion



        //###############################################################################
        //##########                    CONSTRUCTORES                          ##########
        //###############################################################################

        public FormMostrarRuta()
        {
            InitializeComponent();
        }

        public FormMostrarRuta(Bitmap imagen)
        {
            InitializeComponent();
            this.Imagen = imagen;
            byte[] busquedaserializada = Serializador.SerializarObjeto(Program.busqueda);
            timerMovimientoUsuario = new Timer();
            timerMovimientoUsuario.Tick += new EventHandler(timerMovimientoUsuario_Tick);
            

            try
            {
                Program.proxy.TestConexion();
            }
            catch (Exception)
            {
                MessageBox.Show("Se perdió la conexión con el servidor.");
                this.hayExcepcion = true;
                return;
            }
            try
            {
                byte[] rutaserializada = Program.proxy.RealizarBusquedaPorDireccion(busquedaserializada);
                Ruta ruta = (Ruta)Serializador.DeserializarObjeto(rutaserializada, typeof(Ruta));
                ObtenerRutaModoTexto(ruta);
                visorImagen.RutaPintar = ruta;
                Program.posicionamiento.RutaSeguida = ruta;
                timerMovimientoUsuario.Interval = 500;
                timerMovimientoUsuario.Enabled = true;
            }
            catch (Exception)
            {
                MessageBox.Show("La ruta no existe");
                this.hayExcepcion = true;
            }
            
            
            visorImagen.GPS = true;
            Program.posicionamiento.AbrirPuerto();
        }



        private void ObtenerRutaModoTexto(Ruta ruta)
        {
            informacion_texto = new StringBuilder();
            informacion_texto.AppendLine("La ruta a seguir es la siguiente:");
            foreach (Arco arco in ruta.arcos)
            {
                informacion_texto.AppendFormat("  -Desde {0} Nº {1} {2} hasta {3} Nº{4}.\n",
                                                arco.origen.direccion.calle, 
                                                arco.origen.direccion.numero,
                                                arco.transporte.tipoTransporte.ToString(),
                                                arco.destino.direccion.calle,
                                                arco.destino.direccion.numero);
            }

        }


        //###############################################################################
        //##########                          MÉTODOS                          ##########
        //###############################################################################




        //###############################################################################
        //##########                          EVENTOS                          ##########
        //###############################################################################

        private void menuItemAtras_Click(object sender, EventArgs e)
        {
            this.visorImagen.GPS = false;
            FormTipoRuta formularioTipoRuta = new FormTipoRuta(this.imagen);
            formularioTipoRuta.Show();
            this.Hide();
        }

        private void FormMostrarRuta_Closing(object sender, CancelEventArgs e)
        {
            Application.Exit();
        }

        private void checkBox1_CheckStateChanged(object sender, EventArgs e)
        {
            this.visorImagen.CentrarPosicion = checkBox1.Checked;
        }

        internal void CompruebaExcepcion()
        {
            if (hayExcepcion)
            {
                FormOrigenDestino formularioOrigenDestino = new FormOrigenDestino(this.imagen);
                formularioOrigenDestino.Show();
                this.Hide();
            }
        }

        private void menuItem1_Click(object sender, EventArgs e)
        {
            FormAyuda formularioAyuda = new FormAyuda();
            formularioAyuda.Informacion = this.informacion_texto.ToString();
            formularioAyuda.Show();
        }

        void timerMovimientoUsuario_Tick(object sender, EventArgs e)
        {
            this.visorImagen.ActualizaPosicion();
            this.pictureBoxVehiculo.Image = this.visorImagen.imagenSeguimiento;
            this.labelVehiculo.Text = this.visorImagen.TransporteSeguido;
        }
    }
}